概述
LifeCycle 官方文档
Google 提供的Android Architecture Components中包含了 LifeCycle,Lifecycle 实现的一个重要目的,是实现 Android 中与 Activity 和 Fragment 生命周期相关的逻辑控制进一步的解耦。
以前我们写和 Android 生命周期相关的逻辑时,会把相关的代码放在对应的生命周期方法中。这样做的后果时生命周期的代码很臃肿,耦合程度很高。比如在前面介绍的Android 架构 android-architecture 之 todo-mvp 介绍 中需要在 Presenter 中实现生命周期逻辑时是这样做的:
1 | public class TaskDetailFragment extends Fragment implements TaskDetailContract.View { |
LifeCycle 它可以有效避免内存泄漏和解决 Android 生命周期的常见难题。LifeCycle 已经更新到 2.0 版,现已纳入 Jetpack 并包含数据绑定库的新集成。
LifeCycle 组件也是 LiveData 和 ViewModel 的基础组件。LifeCycle 简单独立,可以单独使用,也可以配合上述组件使用。
- LifecycleRegistry:继承自 Lifecycle,实现生命周期的逻辑,LifeCycleOwner 通过持有它实现生命周期事件的分发。
- LifeCycleOwner:Lifecycle 持有者,LifecycleOwner 时一个接口,它仅有一个方法
getLifecycle()
用来表明它持有Lifecycle 对象。它一般是具有生命周期的 Activity 或者 Fragment 组件。 - LifecycleObserver:Lifecycle 的观察者,当它通过 Lifecycle 的
addObserver
方法注册后,它便可以观察 LifeCycleOwner 的生命周期事件。 - State:生命周期状态,当 LifeCycleOwner 生命周期状态改变时,LifecycleRegistry 通过
markState
方法标记 Lifecycle 进入的状态,并向 LifecycleObserver 分发消息。 - Event:生命周期事件,可以在LifecycleObserver中通过注解标记接受某个生命周期状态的方法。
使用方法
Lifecycle 已经是稳定版,它包含在support library 26.1.0 及之后的依赖包中,如果我们的项目基于这些依赖包,那么不需要额外的引用。如果是之前的版本,则要额外添加 LifeCycle 的依赖。
LifeCycle 是 ViewModel 和 LiveData 的基础构件,它们的依赖包中也都包含 Lifecycle。
实现 LifecycleOwner
26.1.0之前的AppCompatActivity
添加依赖:
1 | implementation "android.arch.lifecycle:runtime:1.1.1" |
添加 LifecycleOwner:
1 | public class MainActivity extends AppCompatActivity implements LifecycleOwner{ |
实现LifecycleObserver接口,参考下节。
26.1.0和之后的AppCompatActivity
26.1.0以及以后的 AppCompatActivity
类的父类已经实现了 LifecycleOwner
接口。
1 | public class SupportActivity extends Activity implements LifecycleOwner { |
1 | public class RoomActivity extends AppCompatActivity { |
实现LifecycleObserver接口,参考下节。
实现 LifecycleObserver
关于实现 LifecycleObserver 我们介绍下面两种方法:
- 一个是直接实现 LifecycleObserver 接口,然后通过为方法添加注解的方式来接收生命周期变化的事件。
- 一个是实现 DefaultLifecycleObserver 接口,重写我们感兴趣的生命回调周期方法。
1 | public class MyObserver implements LifecycleObserver { |
要想使用 DefaultLifecycleObserver 需要添加下面的支持 java8 的依赖:
1 | implementation 'android.arch.lifecycle:common-java8:1.1.1' |
1 | public class MyObserver implements DefaultLifecycleObserver { |
DefaultLifecycleObserver 类中的文档提到,
1 | /** |
如果你使用了 Java8,那么就推荐使用 DefaultLifecycleObserver。
源码分析
顺便瞅瞅源码是如何实现的。
生命周期方法注册
LifecycleObserver 的注册是通过 LifecycleRegistry 来完成的, 它实现了 Lifecycle 接口,并持有了 LifecycleOwner 的一个弱引用,可以避免导致 Fragment / Activity 的内存泄漏。
主要来看一下 LifecycleRegistry.addObserver 方法:
1 | public void addObserver(@NonNull LifecycleObserver observer) { |
ObserverWithState 封装了 State 和 GenericLifecycleObserver,后面事件的分发是通过 GenericLifecycleObserver 来进行的。GenericLifecycleObserver 同样实现了 LifecycleObserver 并增加了一个方法 onStateChanged。
1 | static class ObserverWithState { |
来看一下 Lifecycling.getCallback 方法,这个方法的作用就是根据 LifecycleObserver 的不同实现来生成不同的事件分发方法,比如我们前面介绍的可以直接实现 LifecycleObserver 或者是 实现 DefaultLifecycleObserver。
1 | static GenericLifecycleObserver getCallback(Object object) { |
生命周期状态分发
先来看一下事件分发流程的初始流程,因为如果 LifecycleOwner 的使用方式不一样,初始流程也是不一样的。
先来看使用 26.1.0和之后的AppCompatActivity的情况:
1 | ├── ReportFragment.ReportFragment |
使用 26.1.0 之后Activity实现LifecycleOwner的情况:
1 | ├── LifecycleRegistry.markState |
这里没什么好介绍的,大家自行了解即可。
1 | private void forwardPass(LifecycleOwner lifecycleOwner) { |
其实事件的分发主要就是 ObserverWithState.dispatchEvent 的调用,然后调用生成的 GenericLifecycleObserver 对象的 onStateChanged 方法。
ReflectiveGenericLifecycleObserver.onStateChanged
1 | class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver { |
在添加 LifecycleObserver 时会根据 LifecycleObserver 对象生成 ReflectiveGenericLifecycleObserver,根据 LifecycleObserver 生成一个 CallbackInfo 对象。
CallbackInfo 保存了添加了 OnLifecycleEvent 注解的方法以及它对应的生命周期事件。
分发事件通过
1 | void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) { |
通过反射来调用注册的回调方法。
FullLifecycleObserverAdapter.onStateChanged
这个方法其实很简单,就是直接调用 FullLifecycleObserver 的几个生命周期回调方法。
1 | public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { |